home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_562 / intuisup / borders / source.lzh / borders.c < prev    next >
C/C++ Source or Header  |  1991-10-20  |  5KB  |  188 lines

  1.         /*************************************
  2.          *                                   *
  3.          *            Borders v2.0           *
  4.          *   by Torsten Jürgeleit in 05/91   *
  5.          *                                   *
  6.          *              Routines             *
  7.          *                                   *
  8.          *************************************/
  9.  
  10.     /* Includes */
  11.  
  12. #include <exec/types.h>
  13. #include <intuition/intuition.h>
  14. #include <functions.h>
  15. #include "/render/render.h"
  16. #include "borders.h"
  17.  
  18.     /* Defines */
  19.  
  20. #define MAX_BORDER_BUFFER_SIZE            BORDER_TYPE_BOX2_BUFFER_SIZE
  21.  
  22. #define BORDER_VEC_MODE_BOX_TOP_LEFT        0
  23. #define BORDER_VEC_MODE_BOX_BOTTOM_RIGHT    1
  24.  
  25.     /* Static prototypes */
  26.  
  27. VOID fill_border_vec(SHORT *vec, USHORT width, USHORT height, USHORT mode);
  28.  
  29.     /* Static pragmas */
  30.  
  31. #pragma regcall(fill_border_vec(a0,d0,d1,d2))
  32.  
  33.     /* Display borders described by border list */
  34.  
  35.    VOID
  36. display_borders(struct RenderInfo  *ri, struct Window  *win,
  37.                struct BorderData  *bd, SHORT hoffset, SHORT voffset)
  38. {
  39.    while (bd->bd_Type != INTUISUP_DATA_END &&
  40.                       bd->bd_Type <= MAX_BORDER_DATA_TYPE) {
  41.       draw_border(ri, win, bd->bd_LeftEdge + hoffset, bd->bd_TopEdge +
  42.          voffset, bd->bd_Width, bd->bd_Height, (USHORT)bd->bd_Type);
  43.       bd++;
  44.    }
  45. }
  46.     /* Draw border */
  47.  
  48.    VOID
  49. draw_border(struct RenderInfo  *ri, struct Window  *win, USHORT left_edge,
  50.           USHORT top_edge, USHORT width, USHORT height, USHORT type)
  51. {
  52.    USHORT buffer[MAX_BORDER_BUFFER_SIZE];
  53.    BYTE   *border = (BYTE *)&buffer[0];
  54.  
  55.    init_border(ri, border, 0, 0, width, height, type);
  56.    if (ri->ri_Flags & RENDER_INFO_FLAG_INNER_WINDOW) {
  57.       left_edge += ri->ri_WindowBorderLeft;
  58.       top_edge  += ri->ri_WindowBorderTop;
  59.    }
  60.    DrawBorder(win->RPort, (struct Border *)border, (LONG)left_edge, (LONG)
  61.                                  top_edge);
  62. }
  63.     /* Init border */
  64.  
  65.     BYTE *
  66. init_border(struct RenderInfo  *ri, BYTE *buffer, SHORT left_edge,
  67.            SHORT top_edge, USHORT width, USHORT height, USHORT type)
  68. {
  69.    struct Border  *border = (struct Border *)buffer;
  70.    UBYTE  highlight_pen, shadow_pen;
  71.    SHORT  *vec;
  72.    USHORT i, vec_mode, vec_width, vec_height;
  73.  
  74.    switch (type) {
  75.       case BORDER_DATA_TYPE_BOX1_OUT :
  76.       case BORDER_DATA_TYPE_BOX2_OUT :
  77.      highlight_pen = ri->ri_HighlightPen;
  78.      shadow_pen    = ri->ri_ShadowPen;
  79.      break;
  80.       case BORDER_DATA_TYPE_BOX1_IN :
  81.       case BORDER_DATA_TYPE_BOX2_IN :
  82.      highlight_pen = ri->ri_ShadowPen;
  83.      shadow_pen    = ri->ri_HighlightPen;
  84.      break;
  85.    }
  86.    switch (type) {
  87.       case BORDER_DATA_TYPE_BOX1_OUT :
  88.       case BORDER_DATA_TYPE_BOX1_IN :
  89.      vec = (SHORT *)(border + 2);
  90.      for (i = 0; i < 2; i++, border++, vec += 10) {
  91.         if (i & 1) {   /* odd ? */
  92.            border->FrontPen = shadow_pen;
  93.            vec_mode         = BORDER_VEC_MODE_BOX_BOTTOM_RIGHT;
  94.         } else {
  95.            border->FrontPen = highlight_pen;
  96.            vec_mode         = BORDER_VEC_MODE_BOX_TOP_LEFT;
  97.         }
  98.         border->LeftEdge = left_edge;
  99.         border->TopEdge  = top_edge;
  100.         border->DrawMode = JAM1;
  101.         border->Count    = 5;
  102.         border->XY       = vec;
  103.         if (i < 1) {
  104.            border->NextBorder = border + 1;
  105.         } else {
  106.            border->NextBorder = NULL;
  107.         }
  108.         fill_border_vec(vec, width, height, vec_mode);
  109.      }
  110.      buffer += BORDER_TYPE_BOX1_BUFFER_SIZE;
  111.      break;
  112.       case BORDER_DATA_TYPE_BOX2_OUT :
  113.       case BORDER_DATA_TYPE_BOX2_IN :
  114.      vec = (SHORT *)(border + 4);
  115.      for (i = 0; i < 4; i++, border++, vec += 10) {
  116.         if (i < 2) {
  117.            border->LeftEdge = left_edge;
  118.            border->TopEdge  = top_edge;
  119.            if (i & 1) {   /* odd ? */
  120.           border->FrontPen = shadow_pen;
  121.           vec_mode         = BORDER_VEC_MODE_BOX_BOTTOM_RIGHT;
  122.            } else {
  123.           border->FrontPen = highlight_pen;
  124.           vec_mode         = BORDER_VEC_MODE_BOX_TOP_LEFT;
  125.            }
  126.            vec_width  = width;
  127.            vec_height = height;
  128.         } else {
  129.            border->LeftEdge = left_edge + 2;
  130.            border->TopEdge  = top_edge + 1;
  131.            if (i & 1) {   /* odd ? */
  132.           border->FrontPen = highlight_pen;
  133.           vec_mode         = BORDER_VEC_MODE_BOX_BOTTOM_RIGHT;
  134.            } else {
  135.           border->FrontPen = shadow_pen;
  136.           vec_mode         = BORDER_VEC_MODE_BOX_TOP_LEFT;
  137.            }
  138.            vec_width  = width - 4;
  139.            vec_height = height - 2;
  140.         }
  141.         border->DrawMode = JAM1;
  142.         border->Count    = 5;
  143.         border->XY       = vec;
  144.         if (i < 3) {
  145.            border->NextBorder = border + 1;
  146.         } else {
  147.            border->NextBorder = NULL;
  148.         }
  149.         fill_border_vec(vec, vec_width, vec_height, vec_mode);
  150.      }
  151.      buffer += BORDER_TYPE_BOX2_BUFFER_SIZE;
  152.      break;
  153.    }
  154.    return(buffer);
  155. }
  156.     /* Fill border vector array */
  157.  
  158.    STATIC VOID
  159. fill_border_vec(SHORT *vec, USHORT width, USHORT height, USHORT mode)
  160. {
  161.    switch (mode) {
  162.       case BORDER_VEC_MODE_BOX_TOP_LEFT :
  163.      *(vec++) = width - 2;
  164.      *(vec++) = 0;
  165.      *(vec++) = 0;
  166.      *(vec++) = 0;
  167.      *(vec++) = 0;
  168.      *(vec++) = height - 1;
  169.      *(vec++) = 1;
  170.      *(vec++) = height - 2;
  171.      *(vec++) = 1;
  172.      *(vec)   = 1;
  173.      break;
  174.       case BORDER_VEC_MODE_BOX_BOTTOM_RIGHT :
  175.      *(vec++) = 1;
  176.      *(vec++) = height - 1;
  177.      *(vec++) = width - 1;
  178.      *(vec++) = height - 1;
  179.      *(vec++) = width - 1;
  180.      *(vec++) = 0;
  181.      *(vec++) = width - 2;
  182.      *(vec++) = 1;
  183.      *(vec++) = width - 2;
  184.      *(vec)   = height - 2;
  185.      break;
  186.    }
  187. }
  188.